package 数组系列;

import java.util.Arrays;

/**
 * @author fzy
 * @version 1.0
 * @time 2022-01-17
 */
public class Remove_element {
    //写法一   暴力解法
//    public int removeElement(int[] nums, int val) {
//        int n = nums.length;
//        int j = 0;
//        for(int i = 0;i < n;i++){
//            if(nums[i]!=val){	//如果不相等，则令num[j]=num[i],接着看下一个元素
//                nums[j++] = nums[i];
//            }else {
//                while(i < n && nums[i]==val){	//如果相等
//                    i++;	//一直找到不相等的那个
//                }
//                if(i<n)		//i必须小于n，防止数组越界
//                    nums[j++] = nums[i];	//令num[j]=num[i],接着看下一个元素
//            }
//        }
//        return j;
//    }
    //写法二   暴力解法
//    public int removeElement(int[] nums, int val) {
//        int n = nums.length;
//        for(int i = 0;i < n;i++){
//            if(nums[i]==val){
//                for(int j = i + 1 ;j<n; j++){ // 发现需要移除的元素，就将数组集体向前移动一位
//                    nums[j-1] = nums[j];
//                }
//                i--;    // 因为下标i以后的数值都向前移动了一位，所以i也向前移动一位
//                n--;     // 此时数组的大小-1
//            }
//        }
//        return n;
//    }
    //写法三   双指针写法
    // 时间复杂度：O(n)
    // 空间复杂度：O(1)
    public int removeElement(int[] nums, int val) {
        int n = nums.length;
        int slowIndex = 0;  //慢指针
        for(int fastIndex = 0; fastIndex < n; fastIndex++){
            if(val != nums[fastIndex]){
                nums[slowIndex++] = nums[fastIndex];
            }
        }
        return slowIndex;
    }

}
